Любительская метеостанция. Датчик давления BMP180.

Любительская метеостанция. Датчик давления BMP180.

Характеристики датчика давления BMP180 и подключение его к контроллеру ESP8266.

В качестве датчика измерения давления в любительской метеостанции используется BMP180 (GY-68). Рассмотрим, что из себя представляет этот датчик, каким образом его можно подключить к контроллеру, а также приведем пример программы, получающей значения давления и температуры с датчика и выводящего его в последовательный порт.

Описание

Датчик BMP-180 предназначен для измерения атмосферного давления в диапазоне от 300 до 1100 гектопаскалей. Производитель - компания BOSH. Выполнен в виде модуля GY-68, используемого в любительской схемотехнике с использованием Arduino. Помимо любительских конструкций модуль часто используется в полетных контроллерах (мультикоптерах, квадрокоптерах, воздушных шарах, зондах, дельтапланах). 

bmp180

Датчик имеет I2C интерфейс, что позволяет его довольно просто подключать к платформе Arduino и ESP. Количество измерений в секунду может достигать 128, но обычно используют одно измерение в секунду, что увеличивает точность и экономит ток потребления.

Датчик BMP180 возвращает величину давления в гектопаскалях (гПа) (1 гПа = 100 Паскалей = 1мБар). Чтобы получить родные глазу мм рт.ст (миллиметр ртутного столба) требуется произвести пересчет 1 hPa = 0.75006375541921 mmHg

Характеристики датчика

  • Диапазон измерения: 300... 1100гПа (+9000... -500м относительно уровня моря)
  • Напряжение питания: 1.8... 3.6В
  • Интерфейс: I2C
  • Дополнительно: измерение температуры
  • Диапазон измерения температуры: от 0 до 65 °C
  • Точность измерения температуры: ± 2 °C
  • Рабочая температура: от -40 ° C ~ +85 ° C

Подключение датчика к контроллеру

VIN - питание +3.3В

GND - земля

SCL - интерфейс I2C IO5 (GPIO5, D1)

SDA - интерфейс I2C IO4 (GPIO4, D2)

Подключение BMP-180 к ESP8266

Программа получения давления и температуры

Для обмена данными с датчиком используется библиотека BMP180 Breakout Arduino Library и библиотека Wire для работы с I2C.

Поскольку давление зависит от температуры, то перед измерением давления происходит её замер.

#include <SFE_BMP180.h>
#include <Wire.h>

SFE_BMP180 pressure;

void setup() {
  Serial.begin(115200);
  Serial.println("starting");

  if (pressure.begin())
    Serial.println("BMP180 init success");
  else
  {
    Serial.println("BMP180 init fail (disconnected?)\n\n");
    while(1); // Pause forever.
  }
}

void loop() {
  
  char status;
  double T,P,p0,a;
  
  // до измерения давления должна быть измерена температура
  status = pressure.startTemperature(); // начало измерения температуры
  
  if (status != 0){
    
    delay(status); // необходимая задержка перед фактическим измерением
    
    status = pressure.getTemperature(T); // фактическое измерение температуры
    
    if (status != 0){
      Serial.print("Temperature: ");       // Вывод температуры
      Serial.print(T,2);                   
      Serial.println(" C, ");              
      
      status = pressure.startPressure(3); // начало измерения давления аргумент 0.. 3, где 3 - самое точное измерение
      
      if (status != 0) {
        
        delay(status); // необходимая задержка перед фактическим измерением
        
        status = pressure.getPressure(P,T); // фактическое измерение давления
        
        if (status != 0) {
          Serial.print("Absolute pressure: "); // Вывод давления
          Serial.print(P,2);                  
          Serial.print(" mbar, ");            
          Serial.print(P*0.7500637554192,2); // пересчет в ммРтст
          Serial.println(" mmHg");          
        } else {
          Serial.println("error retrieving pressure measurement\n");
        }
      } else {
        Serial.println("error starting pressure measurement\n");
      }
    } else {
      Serial.println("error retrieving temperature measurement\n");
    }
  } else {
    Serial.println("error starting temperature measurement\n");
  }
  delay(5000);   
}

Прошиваем контроллер и открываем монитор порта.

Пример вывода в порт: